package org.architecturerules.eclipse.plugin.builder;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;

import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;

import java.util.Iterator;

// TODO don't toggle but split on separate add/remove actions 
public class ToggleNatureAction
    implements IObjectActionDelegate
{
    private ISelection selection;

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
     */
    public void run( IAction action )
    {
        if ( selection instanceof IStructuredSelection )
        {
            for ( Iterator it = ( (IStructuredSelection) selection ).iterator(  ); it.hasNext(  ); )
            {
                Object element = it.next(  );
                IProject project = null;

                if ( element instanceof IProject )
                {
                    project = (IProject) element;
                } else if ( element instanceof IAdaptable )
                {
                    project = (IProject) ( (IAdaptable) element ).getAdapter( IProject.class );
                }

                if ( project != null )
                {
                    toggleNature( project );
                }
            }
        }
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
     *      org.eclipse.jface.viewers.ISelection)
     */
    public void selectionChanged( IAction action, ISelection selection )
    {
        this.selection = selection;
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction,
     *      org.eclipse.ui.IWorkbenchPart)
     */
    public void setActivePart( IAction action, IWorkbenchPart targetPart )
    {
    }

    /**
     * Toggles sample nature on a project
     *
     * @param project
     *            to have sample nature added or removed
     */
    private void toggleNature( IProject project )
    {
        try
        {
            IProjectDescription description = project.getDescription(  );
            String[] natures = description.getNatureIds(  );

            for ( int i = 0; i < natures.length; ++i )
            {
                if ( ArchitectureRulesNature.NATURE_ID.equals( natures[i] ) )
                {
                    // Remove the nature
                    String[] newNatures = new String[natures.length - 1];
                    System.arraycopy( natures, 0, newNatures, 0, i );
                    System.arraycopy( natures, i + 1, newNatures, i, natures.length - i - 1 );
                    description.setNatureIds( newNatures );
                    project.setDescription( description, null );

                    return;
                }
            }

            // Add the nature
            String[] newNatures = new String[natures.length + 1];
            System.arraycopy( natures, 0, newNatures, 0, natures.length );
            newNatures[natures.length] = ArchitectureRulesNature.NATURE_ID;
            description.setNatureIds( newNatures );
            project.setDescription( description, null );
        } catch ( CoreException e )
        {
        }
    }
}
